// 版权所有2011 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// Package atomic提供低级原子内存原语
// 用于实现同步算法。
// 
// 这些函数需要非常小心才能正确使用。
// 除特殊的低级应用外，同步效果更好
// 使用通道或同步包的设施完成。
// 通过通信共享内存；
// 不要通过共享内存进行通信。
// 
// 由SwapT函数实现的交换操作是原子
// 等效于：
// 
// old=*addr 
// /*addr=new 
// 返回旧
// 
// 比较和交换操作，由CompareAndSwapT 
// 函数实现，是原子等价物：
// 
// 如果*addr==old{
// *addr=new 
// 返回真
// /}
// 返回假
// 
// 添加操作，由AddT函数实现的是原子
// 等价于：
// 
// /*addr+=delta 
// return*addr 
// 
// 由LoadT和StoreT 
// 函数实现的加载和存储操作是“return*addr”的原子等价物和
// /“*addr=val”。
// 
package atomic

import (
	"unsafe"
)

// 错误（rsc）：在386上，64位函数使用奔腾MMX之前无法使用的指令。
// 
// 在非Linux ARM上，64位函数使用ARMv6k内核之前无法使用的指令。
// 
// 在ARM、386和32位MIPS上，调用者负责安排以原子方式访问的64位字的64位对齐。
// 变量或分配的结构、数组或片中的第一个字可以依赖于64位对齐。

// SwapInt32以原子方式将新数据存储到*addr中，并返回以前的*addr值。
func SwapInt32(addr *int32, new int32) (old int32)

// SwapInt64以原子方式将新数据存储到*addr中，并返回以前的*addr值。
func SwapInt64(addr *int64, new int64) (old int64)

// SwapUint32以原子方式将新值存储到*addr中，并返回以前的*addr值。
func SwapUint32(addr *uint32, new uint32) (old uint32)

// SwapUint64以原子方式将新值存储到*addr中，并返回以前的*addr值。
func SwapUint64(addr *uint64, new uint64) (old uint64)

// SwapUintptr以原子方式将新值存储到*addr中，并返回以前的*addr值。
func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)

// swapointer以原子方式将新值存储到*addr中，并返回以前的*addr值。
func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)

// CompareAndSwapInt32对int32值执行比较和交换操作。
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)

// CompareAndSwapInt64对int64值执行比较和交换操作。
func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)

// CompareAndSwapUint32对uint32值执行比较和交换操作。
func CompareAndSwapUint32(addr *uint32, old, new uint32) (swapped bool)

// CompareAndSwapUint64对uint64值执行比较和交换操作。
func CompareAndSwapUint64(addr *uint64, old, new uint64) (swapped bool)

// CompareAndSwapUintptr对uintptr值执行比较和交换操作。
func CompareAndSwapUintptr(addr *uintptr, old, new uintptr) (swapped bool)

// CompareAndSwapPointer对不安全的.Pointer值执行比较和交换操作。
func CompareAndSwapPointer(addr *unsafe.Pointer, old, new unsafe.Pointer) (swapped bool)

// AddInt32以原子方式将增量添加到*addr并返回新值。
func AddInt32(addr *int32, delta int32) (new int32)

// AddUint32以原子方式将增量添加到*addr并返回新值。
// 要从x中减去带符号的正常数值c，请添加32（&x，^uint32（c-1））。
// 特别是，为了减少x，增加32（&x，^uint32（0））。
func AddUint32(addr *uint32, delta uint32) (new uint32)

// AddInt64以原子方式将增量添加到*addr并返回新值。
func AddInt64(addr *int64, delta int64) (new int64)

// AddUint64以原子方式将增量添加到*addr并返回新值。
// 要从x中减去带符号的正常数值c，请添加64（&x，^uint64（c-1））。
// 特别是，为了减少x，增加64（&x，^uint64（0））。
func AddUint64(addr *uint64, delta uint64) (new uint64)

// adduintpttr以原子方式将增量添加到*addr并返回新值。
func AddUintptr(addr *uintptr, delta uintptr) (new uintptr)

// LoadInt32原子加载*addr。
func LoadInt32(addr *int32) (val int32)

// LoadInt64以原子方式加载*addr。
func LoadInt64(addr *int64) (val int64)

// LoadUint32原子加载*addr。
func LoadUint32(addr *uint32) (val uint32)

// LoadUint64以原子方式加载*addr。
func LoadUint64(addr *uint64) (val uint64)

// loaduintpttr以原子方式加载*addr。
func LoadUintptr(addr *uintptr) (val uintptr)

// LoadPointer以原子方式加载*addr。
func LoadPointer(addr *unsafe.Pointer) (val unsafe.Pointer)

// StoreInt32将val以原子方式存储到*addr中。
func StoreInt32(addr *int32, val int32)

// StoreInt64将val以原子方式存储到*addr中。
func StoreInt64(addr *int64, val int64)

// StoreUint32以原子方式将val存储到*addr中。
func StoreUint32(addr *uint32, val uint32)

// StoreUint64以原子方式将val存储到*addr中。
func StoreUint64(addr *uint64, val uint64)

// storeuintpttr以原子方式将val存储到*addr中。
func StoreUintptr(addr *uintptr, val uintptr)

// StorePointer以原子方式将val存储到*addr中。
func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)
